package com.lsj.aop;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;

import java.util.Arrays;

public class MyAspect {
    public void a(){
        System.out.println("额外执行...");
    }

    //前置通知
    public void before() {
        System.out.println("前置通知");
    }
    //后置通知
    public void after() {
        System.out.println("后置通知");
    }
    //环绕通知
    //因为环绕通知是在方法执行时执行 所以涉及到原方法内容
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
        Object[] args = joinPoint.getArgs();//获取请求参数
        System.out.println("环绕通知"+ Arrays.toString(args));
        Object proceed = joinPoint.proceed(args);//调用源方法
        System.out.println("环绕通知"+proceed);
        // ProceedingJoinPoint 环绕通知中使用的获取原方法的参数
        //getArgs()获取原方法请求执行时传入的参数
        //proceed(args)调用执行原方法传入参数
        return proceed;
    }

    //异常通知
    public void afterThrowing(Exception e11) {
        System.out.println("异常通知"+e11);
    }
    //返回通知
    public void afterReturning(JoinPoint joinPoint, Object res) throws Throwable {
        System.out.println("返回通知"+Arrays.toString(joinPoint.getArgs())+"|"+res);
    }
}
